﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Data;
using tenpay;
using System.Collections;
using Com.Alipay;

namespace NJL.Web
{
    public partial class CompanyOrderPay : BasePageVisitor
    {
        #region 网银在线
        //必要的交易信息
        protected string v_amount;       // 订单金额
        protected string v_moneytype;    // 币种
        protected string v_md5info;      // 对拼凑串MD5私钥加密后的值
        protected string v_mid;		 // 商户号
        protected string v_url;		 // 返回页地址
        protected string v_oid;		 // 推荐订单号构成格式为 年月日-商户号-小时分钟秒

        //收货信息
        protected string v_rcvname;      // 收货人
        protected string v_rcvaddr;      // 收货地址
        protected string v_rcvtel;       // 收货人电话
        protected string v_rcvpost;      // 收货人邮编
        protected string v_rcvemail;     // 收货人邮件
        protected string v_rcvmobile;    // 收货人手机号

        //订货人信息
        protected string v_ordername;    // 订货人姓名
        protected string v_orderaddr;    // 订货人地址
        protected string v_ordertel;     // 订货人电话
        protected string v_orderpost;    // 订货人邮编
        protected string v_orderemail;   // 订货人邮件
        protected string v_ordermobile;  // 订货人手机号
        protected string pmode_id;
        //两个备注
        protected string remark1;
        protected string remark2;
        #endregion
        #region 易宝支付
        protected string yeePayOrderID;//商家订单号
        protected string yeePayAmount; //支付金额
        protected string yeePayProductName;//商品名称
        protected string yeePayPcat;       //商品种类
        protected string yeePayPdesc;      //商品描述
        protected string yeePayUrl;        //支付成功返回URL
        protected string yeePayFrpId;       //支付通道编码
        #endregion

        private readonly NJL.BLL.NJL_BOOK_ORDER bllOrder = new BLL.NJL_BOOK_ORDER();
        protected NJL.Model.NJL_BOOK_ORDER modelOrder;
        protected NJL.BLL.NJL_SYS_CS_PAY_MAP bllPayMap = new BLL.NJL_SYS_CS_PAY_MAP();
        NJL.Model.NJL_SYS_CS_PAY_MAP modelPayMap;
        ListItem item;
        protected void Page_Load(object sender, EventArgs e)
        {
            modelOrder = bllOrder.GetModel(Request.QueryString["id"]);

            modelPayMap = bllPayMap.GetModel("3");
            #region 网银在线
            v_mid = modelPayMap.PAY_COMPANY_ID;			 // 商户号，这里为测试商户号1001，替换为自己的商户号即可
            v_url = "http://" + WEBSITE_DOMAIN + "/Payment/chinabank/Receive.aspx"; // 商户自定义返回接收支付结果的页面
            // MD5密钥要跟订单提交页相同，如Send.asp里的 key = "test" ,修改""号内 test 为您的密钥
            string key = modelPayMap.PAY_COMPANY_KEY;				 // 如果您还没有设置MD5密钥请登陆我们为您提供商户后台，地址：https://merchant3.chinabank.com.cn/
            // 登陆后在上面的导航栏里可能找到“B2C”，在二级导航栏里有“MD5密钥设置”
            // 建议您设置一个16位以上的密钥或更高，密钥最多64位，但设置16位已经足够了

            v_oid = modelOrder.ORDER_NO;

            if (v_oid == null || v_oid.Equals(""))
            {
                DateTime dt = DateTime.Now;
                string v_ymd = dt.ToString("yyyyMMdd"); // yyyyMMdd
                string timeStr = dt.ToString("HHmmss"); // HHmmss
                v_oid = v_ymd + v_mid + timeStr;
            }

            v_amount = string.Format("{0:0.00}", modelOrder.ORDER_TOTAL);

            v_moneytype = "CNY";

            string text = v_amount + v_moneytype + v_oid + v_mid + v_url + key; // 拼凑加密串

            v_md5info = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(text, "md5").ToUpper();

            //收货信息
            v_rcvname = Request["v_rcvname"];
            v_rcvaddr = Request["v_rcvaddr"];
            v_rcvtel = Request["v_rcvtel"];
            v_rcvpost = Request["v_rcvpost"];
            v_rcvemail = Request["v_rcvemail"];
            v_rcvmobile = Request["v_rcvmobile"];

            //订货人信息
            v_ordername = Request["v_ordername"];
            v_orderaddr = Request["v_orderaddr"];
            v_ordertel = Request["v_ordertel"];
            v_orderpost = Request["v_orderpost"];
            v_orderemail = Request["v_orderemail"];
            v_ordermobile = Request["v_ordermobile"];

            remark1 = Request["remark1"];
            remark2 = Request["remark2"];
            #endregion
            #region 易宝支付
            yeePayOrderID = modelOrder.ORDER_NO;
            yeePayAmount = string.Format("{0:0.00}", modelOrder.ORDER_TOTAL);
            yeePayUrl = "http://" + WEBSITE_DOMAIN + "/Payment/yeepay/Callback.aspx";
            #endregion
            if (!IsPostBack)
            {
                DataSet ds = bllPayMap.GetList("");
                foreach (DataRow row in ds.Tables[0].Rows)
                {
                    if (row[0].ToString() == "1" || row[0].ToString() == "2")
                    {

                        item = new ListItem();
                        item.Text = "<img src=\"/Images/zf" + row[0] + ".jpg \" alt=\"" + row["TYPE_NAME"] + "\" title=\"" + row["TYPE_NAME"] + " \" align=\"absminddle\" />";
                        item.Value = row[0].ToString();
                        rblPayment.Items.Add(item);
                    }


                }
            }
        }
        protected void btnSubmit_Click(object sender, EventArgs e)
        {
            //支付宝
            if (rblPayment.SelectedValue == "1")
            {
                ////////////////////////////////////////////请求参数////////////////////////////////////////////

                //必填参数//

                //请与贵网站订单系统中的唯一订单号匹配
                string out_trade_no = modelOrder.ORDER_NO;// DateTime.Now.ToString("yyyyMMddHHmmss");
                //订单名称，显示在支付宝收银台里的“商品名称”里，显示在支付宝的交易管理的“商品名称”的列表里。
                string subject = "订单号为:" + modelOrder.ORDER_NO;
                //订单描述、订单详细、订单备注，显示在支付宝收银台里的“商品描述”里
                string body = "";
                //订单总金额，显示在支付宝收银台里的“应付总额”里
                string total_fee = string.Format("{0:0.00}", modelOrder.ORDER_TOTAL);



                //扩展功能参数——默认支付方式//

                //默认支付方式，代码见“即时到帐接口”技术文档
                string paymethod = "";
                //默认网银代号，代号列表见“即时到帐接口”技术文档“附录”→“银行列表”
                string defaultbank = "";

                //扩展功能参数——防钓鱼//

                //防钓鱼时间戳
                string anti_phishing_key = "";
                //获取客户端的IP地址，建议：编写获取客户端IP地址的程序
                string exter_invoke_ip = "";
                //注意：
                //请慎重选择是否开启防钓鱼功能
                //exter_invoke_ip、anti_phishing_key一旦被设置过，那么它们就会成为必填参数
                //建议使用POST方式请求数据
                //示例：
                //exter_invoke_ip = "";
                //Service aliQuery_timestamp = new Service();
                //anti_phishing_key = aliQuery_timestamp.Query_timestamp();               //获取防钓鱼时间戳函数

                //扩展功能参数——其他//

                //商品展示地址，要用http:// 格式的完整路径，不允许加?id=123这类自定义参数
                string show_url = "#";
                //自定义参数，可存放任何内容（除=、&等特殊字符外），不会显示在页面上
                string extra_common_param = "";
                //默认买家支付宝账号
                string buyer_email = "";

                //扩展功能参数——分润(若要使用，请按照注释要求的格式赋值)//

                //提成类型，该值为固定值：10，不需要修改
                string royalty_type = "";
                //提成信息集
                string royalty_parameters = "";
                //注意：
                //与需要结合商户网站自身情况动态获取每笔交易的各分润收款账号、各分润金额、各分润说明。最多只能设置10条
                //各分润金额的总和须小于等于total_fee
                //提成信息集格式为：收款方Email_1^金额1^备注1|收款方Email_2^金额2^备注2
                //示例：
                //royalty_type = "10";
                //royalty_parameters = "111@126.com^0.01^分润备注一|222@126.com^0.01^分润备注二";

                ////////////////////////////////////////////////////////////////////////////////////////////////

                //把请求参数打包成数组
                SortedDictionary<string, string> sParaTemp = new SortedDictionary<string, string>();
                sParaTemp.Add("payment_type", "1");
                sParaTemp.Add("show_url", show_url);
                sParaTemp.Add("out_trade_no", out_trade_no);
                sParaTemp.Add("subject", subject);
                sParaTemp.Add("body", body);
                sParaTemp.Add("total_fee", total_fee);
                sParaTemp.Add("paymethod", paymethod);
                sParaTemp.Add("defaultbank", defaultbank);
                sParaTemp.Add("anti_phishing_key", anti_phishing_key);
                sParaTemp.Add("exter_invoke_ip", exter_invoke_ip);
                sParaTemp.Add("extra_common_param", extra_common_param);
                sParaTemp.Add("buyer_email", buyer_email);
                sParaTemp.Add("royalty_type", royalty_type);
                sParaTemp.Add("royalty_parameters", royalty_parameters);

                //构造即时到帐接口表单提交HTML数据，无需修改
                Service ali = new Service();

                string sHtmlText = ali.Create_direct_pay_by_user(sParaTemp);
                Response.Write(sHtmlText);
            }
            //财付通
            else if (rblPayment.SelectedValue == "2")
            {
                modelPayMap = bllPayMap.GetModel(rblPayment.SelectedValue);

                //商户号
                string bargainor_id = modelPayMap.PAY_COMPANY_ID;

                //密钥
                string key = modelPayMap.PAY_COMPANY_KEY;

                //当前时间 yyyyMMdd
                string date = DateTime.Now.ToString("yyyyMMdd");

                //生成订单10位序列号，此处用时间和随机数生成，商户根据自己调整，保证唯一
                //string strReq = "" + DateTime.Now.ToString("HHmmss") + TenpayUtil.BuildRandomStr(4);
                string strReq = modelOrder.ORDER_NO;
                //商户订单号，不超过32位，财付通只做记录，不保证唯一性
                string sp_billno = strReq;

                //财付通订单号，10位商户号+8位日期+10位序列号，需保证全局唯一
                string transaction_id = bargainor_id + date + strReq;
                string return_url = "http://" + WEBSITE_DOMAIN + "/Payment/tenpay/return_url.aspx";

                //创建PayRequestHandler实例
                PayRequestHandler reqHandler = new PayRequestHandler(Context);
                string transaction_price = string.Format("{0:0}", (modelOrder.ORDER_TOTAL * 100));
                //设置密钥
                reqHandler.setKey(key);

                //初始化
                reqHandler.init();

                //-----------------------------
                //设置支付参数
                //-----------------------------
                reqHandler.setParameter("bargainor_id", bargainor_id);			//商户号
                reqHandler.setParameter("sp_billno", sp_billno);				//商家订单号
                reqHandler.setParameter("transaction_id", transaction_id);		//财付通交易单号
                reqHandler.setParameter("return_url", return_url);				//支付通知url
                reqHandler.setParameter("desc", "订单号：" + transaction_id);	//商品名称
                reqHandler.setParameter("total_fee", transaction_price);	    //商品金额,以分为单位
                reqHandler.setParameter("cs", "utf-8");                         //设置编码




                //用户ip,测试环境时不要加这个ip参数，正式环境再加此参数
                reqHandler.setParameter("spbill_create_ip", Page.Request.UserHostAddress);

                //获取请求带参数的url
                //string requestUrl = reqHandler.getRequestURL();

                //string a_link = "<a target=\"_blank\" href=\"" + requestUrl + "\">" + "财付通支付" + "</a>";

                //Response.Write(a_link);


                //post实现方式

                reqHandler.getRequestURL();
                Response.Write("<form  method=\"post\" action=\"" + reqHandler.getGateUrl() + "\"> \n");
                Hashtable ht = reqHandler.getAllParameters();
                foreach (DictionaryEntry de in ht)
                {
                    Response.Write("<input type=\"hidden\" name=\"" + de.Key + "\" value=\"" + de.Value + "\" >\n");
                }
                Response.Write("</form>\n<script type=\"text/javascript\">document.forms[0].submit();</script>");


                //获取debug信息
                //string debuginfo = reqHandler.getDebugInfo();
                //Response.Write("<br/>" + debuginfo + "<br/>");

                //重定向到财付通支付
                //reqHandler.doSend();
            }
            else if (rblPayment.SelectedValue == "3")
            {
                Page.ClientScript.RegisterStartupScript(GetType(), "chinabank", "<script type=\"text/javascript\">sumbitchinabank();</script>");
            }
            else if (rblPayment.SelectedValue == "4")
            {
                Page.ClientScript.RegisterStartupScript(GetType(), "chinabank", "<script type=\"text/javascript\">submitYeePay();</script>");
            }
        }
    }
}